home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume89 / aplictns / plplot.7 < prev    next >
Internet Message Format  |  1989-04-25  |  59KB

  1. Path: xanth!indri!ames!oliveb!sun!rishathra!page
  2. From: page%rishathra@Sun.COM (Bob Page)
  3. Newsgroups: comp.sources.amiga
  4. Subject: v89i092:  plplot - scientific plotting library, Part07/07
  5. Message-ID: <100944@sun.Eng.Sun.COM>
  6. Date: 25 Apr 89 05:47:57 GMT
  7. Sender: news@sun.Eng.Sun.COM
  8. Lines: 2206
  9. Approved: page@sun.com
  10.  
  11. Submitted-by: amr@dukee.egr.duke.edu (Tony Richardson)
  12. Posting-number: Volume 89, Issue 92
  13. Archive-name: applications/plplot.7
  14.  
  15. # This is a shell archive.
  16. # Remove anything above and including the cut line.
  17. # Then run the rest of the file through 'sh'.
  18. # Unpacked files will be owned by you and have default permissions.
  19. #----cut here-----cut here-----cut here-----cut here----#
  20. #!/bin/sh
  21. # shar: SHell ARchive
  22. # Run the following text through 'sh' to create:
  23. #    plot3d.c
  24. #    plplot.h
  25. #    plpoi1.c
  26. #    plpoin.c
  27. #    plptex.c
  28. #    plr135.c
  29. #    plr45.c
  30. #    plschr.c
  31. #    plside3.c
  32. #    plsmaj.c
  33. #    plsmin.c
  34. #    plssym.c
  35. #    plstar.c
  36. #    plstik.c
  37. #    plstr.c
  38. #    plstrl.c
  39. #    plstyl.c
  40. #    plsvpa.c
  41. #    plsym.c
  42. #    plsym1.c
  43. #    plt3zz.c
  44. #    pltext.c
  45. #    plvpor.c
  46. #    plvsta.c
  47. #    plw3d.c
  48. #    plwind.c
  49. #    plxtik.c
  50. #    plxybx.c
  51. #    plxytx.c
  52. #    plytik.c
  53. #    plzbx.c
  54. #    plztx.c
  55. #    round.c
  56. #    scratch
  57. #    setphy.c
  58. #    setpxl.c
  59. #    setsub.c
  60. #    stindex.c
  61. #    strpos.c
  62. #    tektronix.c
  63. #    xform.c
  64. # This is archive 7 of a 7-part kit.
  65. # This archive created: Thu Apr 20 13:47:08 1989
  66. echo "extracting plot3d.c"
  67. sed 's/^X//' << \SHAR_EOF > plot3d.c
  68. X/* Plots a 3-d representation of the function z[x][y]. The x values */
  69. X/* are stored as x[0..nx-1], the y values as y[0..ny-1], and the */
  70. X/* z values are in the 2-d array z[][0..ly-1]. The integer "opt" */
  71. X/* specifies: */
  72. X/*  opt = 1:  Draw lines parallel to x-axis */
  73. X/*  opt = 2:  Draw lines parallel to y-axis */
  74. X/*  opt = 3:  Draw lines parallel to both axes */
  75. X
  76. X/* "work" is an integer work array of size at least 4*max(nx,ny) */
  77. X
  78. X#include "plplot.h"
  79. X#include <math.h>
  80. X
  81. Xvoid plot3d(x,y,z,work,ly,nx,ny,opt)
  82. Xint ly, nx, ny, opt;
  83. Xfloat x[],y[],*z;
  84. Xint work[];
  85. X{
  86. X      int b;
  87. X      float cxx, cxy, cyx, cyy, cyz;
  88. X
  89. X      int init;
  90. X      int i, ix, iy;
  91. X
  92. X      int level;
  93. X      glev(&level);
  94. X      if (level < 3) fatal("Please set up window before calling PLOT3D");
  95. X      if (opt<1 || opt>3) fatal("Bad option in PLOT3D");
  96. X      if (nx<=0 || ny<=0 || ly<ny) fatal("Bad array dimensions in PLOT3D.");
  97. X
  98. X/* Check that points in x and in y are strictly increasing */
  99. X
  100. X      for (i=0; i<nx-1; i++)
  101. X        if (x[i]>=x[i+1]) fatal("X(*) must be strictly increasing in PLOT3D");
  102. X
  103. X      for (i=0; i<ny-1; i++)
  104. X        if (y[i]>=y[i+1]) fatal("Y(*) must be strictly increasing in PLOT3D");
  105. X
  106. X      b = 2*max(nx,ny)+1;
  107. X      gw3wc(&cxx,&cxy,&cyx,&cyy,&cyz);
  108. X      init = 1;
  109. X      
  110. X      if (cxx >= 0.0 && cxy <= 0.0) {
  111. X        if (opt != 2) {
  112. X          for (iy=2; iy<=ny; iy++)  {
  113. X            plt3zz(1,iy,1,-1,-opt,init,x,y,z,ly,nx,ny,&work[0],&work[b-1]);
  114. X            init = 0;
  115. X          }
  116. X        }
  117. X        else  {
  118. X          plt3zz(1,ny,1,-1,-opt,init,x,y,z,ly,nx,ny,&work[0],&work[b-1]);
  119. X          init = 0;
  120. X        }
  121. X        if (opt != 1) 
  122. X          for (ix=1; ix<=nx-1; ix++)
  123. X            plt3zz(ix,ny,1,-1,opt,init,x,y,z,ly,nx,ny,&work[0],&work[b-1]);
  124. X        else
  125. X          plt3zz(1,ny,1,-1,opt,init,x,y,z,ly,nx,ny,&work[0],&work[b-1]);
  126. X      }
  127. X      else if (cxx <= 0.0 && cxy <= 0.0) {
  128. X        if (opt != 1) {
  129. X          for (ix=2; ix<=nx; ix++) {
  130. X            plt3zz(ix,ny,-1,-1,opt,init,x,y,z,ly,nx,ny,&work[0],&work[b-1]);
  131. X            init = 0;
  132. X          }
  133. X        }
  134. X        else  {
  135. X          plt3zz(nx,ny,-1,-1,opt,init,x,y,z,ly,nx,ny,&work[0],&work[b-1]);
  136. X          init = 0;
  137. X        }
  138. X        if (opt != 2) 
  139. X          for (iy=ny; iy>=2; iy--)
  140. X            plt3zz(nx,iy,-1,-1,-opt,init,x,y,z,ly,nx,ny,&work[0],&work[b-1]);
  141. X        else
  142. X          plt3zz(nx,ny,-1,-1,-opt,init,x,y,z,ly,nx,ny,&work[0],&work[b-1]);
  143. X      }
  144. X      else if (cxx <= 0.0 && cxy >= 0.0) {
  145. X        if (opt != 2) {
  146. X          for (iy=ny-1; iy>=1; iy--) {
  147. X            plt3zz(nx,iy,-1,1,-opt,init,x,y,z,ly,nx,ny,&work[0],&work[b-1]);
  148. X            init = 0;
  149. X          }
  150. X        }
  151. X        else {
  152. X          plt3zz(nx,1,-1,1,-opt,init,x,y,z,ly,nx,ny,&work[0],&work[b-1]);
  153. X          init = 0;
  154. X        }
  155. X        if (opt != 1)
  156. X          for (ix=nx; ix>=2; ix--)
  157. X            plt3zz(ix,1,-1,1,opt,init,x,y,z,ly,nx,ny,&work[0],&work[b-1]);
  158. X        else
  159. X          plt3zz(nx,1,-1,1,opt,init,x,y,z,ly,nx,ny,&work[0],&work[b-1]);
  160. X      }
  161. X      else if (cxx >= 0.0 && cxy >= 0.0) {
  162. X        if (opt != 1) {
  163. X          for (ix=nx-1; ix>=1; ix--) {
  164. X            plt3zz(ix,1,1,1,opt,init,x,y,z,ly,nx,ny,&work[0],&work[b-1]);
  165. X            init = 0;
  166. X          }
  167. X        }
  168. X        else  {
  169. X          plt3zz(1,1,1,1,opt,init,x,y,z,ly,nx,ny,&work[0],&work[b-1]);
  170. X          init = 0;
  171. X        }
  172. X        if (opt != 2)
  173. X          for (iy=1; iy<=ny-1; iy++)
  174. X            plt3zz(1,iy,1,1,-opt,init,x,y,z,ly,nx,ny,&work[0],&work[b-1]);
  175. X        else
  176. X          plt3zz(1,1,1,1,-opt,init,x,y,z,ly,nx,ny,&work[0],&work[b-1]);
  177. X      }      
  178. X}
  179. SHAR_EOF
  180. echo "extracting plplot.h"
  181. sed 's/^X//' << \SHAR_EOF > plplot.h
  182. X/* This file contains all of the type declarations for the functions *
  183. X * in the plplot library.  This file should be included in all user  *
  184. X * routines that make use of that library.                           */
  185. X
  186. X/* All of the void type declarations are made first. */
  187. Xvoid pladv();
  188. Xvoid plbeg();
  189. Xvoid plbin();
  190. Xvoid plbox();
  191. Xvoid plccal();
  192. Xvoid plclr();
  193. Xvoid plcntr();
  194. Xvoid plcol();
  195. Xvoid plcont();
  196. Xvoid pldeco();
  197. Xvoid pldtik();
  198. Xvoid plend();
  199. Xvoid plenv();
  200. Xvoid plerrx();
  201. Xvoid plerry();
  202. Xvoid plerx1();
  203. Xvoid plery1();
  204. Xvoid plfont();
  205. Xvoid plform();
  206. Xvoid plgra();
  207. Xvoid plgspa();
  208. Xvoid plhist();
  209. Xvoid plhrsh();
  210. Xvoid pljoin();
  211. Xvoid pllab();
  212. Xvoid pllclp();
  213. Xvoid plline();
  214. Xvoid plmtex();
  215. Xvoid plnxtv();
  216. Xvoid plpoi1();
  217. Xvoid plpoin();
  218. Xvoid plptex();
  219. Xvoid plr135();
  220. Xvoid plr45();
  221. Xvoid plschr();
  222. Xvoid plsmaj();
  223. Xvoid plsmin();
  224. Xvoid plssym();
  225. Xvoid plstar();
  226. Xvoid plstik();
  227. Xvoid plstr();
  228. Xvoid plstyl();
  229. Xvoid plsvpa();
  230. Xvoid plsym();
  231. Xvoid plsym1();
  232. Xvoid pltext();
  233. Xvoid plupd();
  234. Xvoid plvpor();
  235. Xvoid plvsta();
  236. Xvoid plwind();
  237. Xvoid plxtik();
  238. Xvoid plxybx();
  239. Xvoid plxytx();
  240. Xvoid plytik();
  241. Xvoid plzbx();
  242. Xvoid plztx();
  243. X
  244. X/* 3-D routine types*/
  245. Xvoid pl3cut();
  246. Xvoid plbox3();
  247. Xvoid plgrid3();
  248. Xvoid plot3d();
  249. Xvoid plside3();
  250. Xvoid plt3zz();
  251. Xvoid plw3d();
  252. X
  253. X/* The novice plplot user will not need to call the following functions */
  254. Xvoid fatal();
  255. Xvoid genlin();
  256. Xvoid movphy();
  257. Xvoid draphy();
  258. Xvoid movwor();
  259. Xvoid drawor();
  260. Xvoid setphy();
  261. Xvoid setpxl();
  262. Xvoid setsub();
  263. Xvoid xform();
  264. Xvoid glev();
  265. Xvoid slev();
  266. Xvoid gbase();
  267. Xvoid sbase();
  268. Xvoid gnms();
  269. Xvoid snms();
  270. Xvoid gdev();
  271. Xvoid sdev();
  272. Xvoid gcurr();
  273. Xvoid scurr();
  274. Xvoid gdom();
  275. Xvoid sdom();
  276. Xvoid grange();
  277. Xvoid srange();
  278. Xvoid gw3wc();
  279. Xvoid sw3wc();
  280. Xvoid gvpp();
  281. Xvoid svpp();
  282. Xvoid gspp();
  283. Xvoid sspp();
  284. Xvoid gclp();
  285. Xvoid sclp();
  286. Xvoid gphy();
  287. Xvoid sphy();
  288. Xvoid gsub();
  289. Xvoid ssub();
  290. Xvoid gumpix();
  291. Xvoid sumpix();
  292. Xvoid gatt();
  293. Xvoid satt();
  294. Xvoid gspd();
  295. Xvoid sspd();
  296. Xvoid gvpd();
  297. Xvoid svpd();
  298. Xvoid gvpw();
  299. Xvoid svpw();
  300. Xvoid gpixmm();
  301. Xvoid spixmm();
  302. Xvoid gwp();
  303. Xvoid swm();
  304. Xvoid gwm();
  305. Xvoid swp();
  306. Xvoid gdp();
  307. Xvoid sdp();
  308. Xvoid gmp();
  309. Xvoid smp();
  310. Xvoid gchr();
  311. Xvoid schr();
  312. Xvoid gsym();
  313. Xvoid ssym();
  314. Xvoid gmaj();
  315. Xvoid smaj();
  316. Xvoid gmin();
  317. Xvoid smin();
  318. X
  319. X/* Functions that return floats */
  320. Xfloat plstrl();
  321. Xfloat dcmmx();
  322. Xfloat dcmmy();
  323. Xfloat dcscx();
  324. Xfloat dcscy();
  325. Xfloat mmdcx();
  326. Xfloat mmdcy();
  327. Xfloat scdcx();
  328. Xfloat scdcy();
  329. Xfloat wcmmx();
  330. Xfloat wcmmy();
  331. Xfloat w3wcx();
  332. Xfloat w3wcy();
  333. X
  334. X/* Functions returning ints */
  335. Xint plabv();
  336. Xint plcvec();
  337. Xint dcpcx();
  338. Xint dcpcy();
  339. Xint mmpcx();
  340. Xint mmpcy();
  341. Xint round();
  342. Xint stindex();
  343. Xint strpos();
  344. Xint wcpcx();
  345. Xint wcpcy();
  346. X
  347. X/* Device independent routines */
  348. Xvoid grbeg();
  349. Xvoid grclr();
  350. Xvoid grcol();
  351. Xvoid grinit();
  352. Xvoid grgra();
  353. Xvoid grline();
  354. Xvoid grtext();
  355. Xvoid grtidy();
  356. X
  357. X/* Declarations for any new device drivers should be added to the list *
  358. X * below.  These routines are called only in the file plstar.c (except *
  359. X * for beepw() which is also called by ???) */
  360. Xvoid amiini();
  361. Xvoid amitex();
  362. Xvoid amigra();
  363. Xvoid amicol();
  364. Xvoid amiclr();
  365. Xvoid amilin();
  366. Xvoid amitid();
  367. Xvoid beepw();
  368. X
  369. Xvoid tekini();
  370. Xvoid tektex();
  371. Xvoid tekgra();
  372. Xvoid tekclr();
  373. Xvoid tekcol();
  374. Xvoid teklin();
  375. Xvoid tektid();
  376. X
  377. Xvoid impini();
  378. Xvoid imptex();
  379. Xvoid impgra();
  380. Xvoid impclr();
  381. Xvoid impcol();
  382. Xvoid implin();
  383. Xvoid imptid();
  384. X
  385. Xvoid jetini();
  386. Xvoid jettex();
  387. Xvoid jetgra();
  388. Xvoid jetclr();
  389. Xvoid jetcol();
  390. Xvoid jetlin();
  391. Xvoid jettid();
  392. SHAR_EOF
  393. echo "extracting plpoi1.c"
  394. sed 's/^X//' << \SHAR_EOF > plpoi1.c
  395. X#include "plplot.h"
  396. X
  397. Xextern short int *hersh[];
  398. X
  399. Xvoid plpoi1(x,y,code)
  400. Xfloat x,y;
  401. Xint code;
  402. X{
  403. X      int sym, font, col;
  404. X
  405. X/* Initialize parameters. */
  406. X
  407. X      gatt(&font,&col);
  408. X      sym = *(hersh[font-1]+code);
  409. X      plhrsh(sym,wcpcx(x),wcpcy(y));
  410. X}
  411. SHAR_EOF
  412. echo "extracting plpoin.c"
  413. sed 's/^X//' << \SHAR_EOF > plpoin.c
  414. X/* Plots single precision array y against x for n points using */
  415. X/* ASCII code "code" */
  416. X
  417. X#include "plplot.h"
  418. X
  419. Xvoid plpoin(n,x,y,code)
  420. Xint n, code;
  421. Xfloat x[],y[];
  422. X{
  423. X      int i;
  424. X
  425. X      int level;
  426. X      glev(&level);
  427. X      if (level < 3) fatal("Please set up window before calling PLPOIN.");
  428. X      if (code < 0 || code > 127) fatal("Invalid code in PLPOIN.");
  429. X
  430. X      for(i=0; i<n; i++)
  431. X        plpoi1(x[i],y[i],code);
  432. X}
  433. SHAR_EOF
  434. echo "extracting plptex.c"
  435. sed 's/^X//' << \SHAR_EOF > plptex.c
  436. X/* Prints out "text" at world cooordinate (x,y). The text may be       */
  437. X/* at any angle "angle" relative to the horizontal. The parameter      */
  438. X/* "just" adjusts the horizontal justification of the string:          */
  439. X/*   just = 0.0 => left hand edge of string is at (x,y)                */
  440. X/*   just = 1.0 => right hand edge of string is at (x,y)               */
  441. X/*   just = 0.5 => centre of string is at (x,y) etc.                   */
  442. X/* N.B. Centreline of the string passes through (x,y)                  */
  443. X
  444. X#include "plplot.h"
  445. X#include <math.h>
  446. X
  447. Xvoid plptex(x,y,dx,dy,just,text)
  448. Xfloat x,y,dx,dy,just;
  449. Xchar *text;
  450. X{      
  451. X      int refx, refy;
  452. X      float shift, cc, ss;
  453. X      float xform[4],diag;
  454. X      float xscl, xoff, yscl, yoff;
  455. X   
  456. X      int level;
  457. X      glev(&level);
  458. X      if (level < 3) fatal("Please set up window before calling PLPTEX.");
  459. X
  460. X      gwm(&xscl,&xoff,&yscl,&yoff);
  461. X      cc = xscl * dx;
  462. X      ss = yscl * dy;
  463. X      diag = sqrt(cc*cc + ss*ss);
  464. X      cc = cc/diag;
  465. X      ss = ss/diag;
  466. X      
  467. X      gmp(&xscl,&xoff,&yscl,&yoff);
  468. X      shift = 0.0;
  469. X      
  470. X      xform[0] = cc;
  471. X      xform[1] = -ss;
  472. X      xform[2] = ss;
  473. X      xform[3] = cc;
  474. X
  475. X      if (just != 0.0) shift = plstrl(text) * just;
  476. X      refx = wcpcx(x) - shift * cc * xscl;
  477. X      refy = wcpcy(y) - shift * ss * yscl;
  478. X      plstr(0,xform,refx,refy,text);
  479. X}
  480. SHAR_EOF
  481. echo "extracting plr135.c"
  482. sed 's/^X//' << \SHAR_EOF > plr135.c
  483. X#include "plplot.h"
  484. X
  485. Xvoid plr135(ix,iy,isens)
  486. Xint *ix, *iy, isens;
  487. X{
  488. X      *ix = -*ix;
  489. X      *iy = -*iy;
  490. X      plr45(ix,iy,isens);
  491. X}
  492. SHAR_EOF
  493. echo "extracting plr45.c"
  494. sed 's/^X//' << \SHAR_EOF > plr45.c
  495. X#include "plplot.h"
  496. X#include <math.h>
  497. X
  498. Xvoid plr45(ix,iy,isens)
  499. Xint *ix, *iy, isens;
  500. X{
  501. X      int ixx, iyy;
  502. X
  503. X      ixx = *ix-isens*(*iy);
  504. X      iyy = *ix * isens + *iy;
  505. X      *ix = ixx/max(1,abs(ixx));
  506. X      *iy = iyy/max(1,abs(iyy));
  507. X}
  508. SHAR_EOF
  509. echo "extracting plschr.c"
  510. sed 's/^X//' << \SHAR_EOF > plschr.c
  511. X#include "plplot.h"
  512. X
  513. Xvoid plschr(def,scale)
  514. Xfloat def,scale;
  515. X{
  516. X    float defalt, ht;
  517. X
  518. X    if (def != 0.0) 
  519. X       schr(def,scale*def);
  520. X    else {
  521. X       gchr(&defalt,&ht);
  522. X       schr(defalt,scale*defalt);
  523. X    }
  524. X}
  525. SHAR_EOF
  526. echo "extracting plside3.c"
  527. sed 's/^X//' << \SHAR_EOF > plside3.c
  528. X/* This routine draws sides around the front of the 3d plot so that */
  529. X/* it does not appear to float */
  530. X
  531. X#include "plplot.h"
  532. X
  533. Xvoid plside3(x,y,z,nx,ny,ly,opt)
  534. Xint nx, ny, ly, opt;
  535. Xfloat *x, *y, *z;
  536. X{
  537. X    int i;
  538. X    float cxx, cxy, cyx, cyy, cyz;
  539. X    float xmin, ymin, zmin, xmax, ymax, zmax, zscale;
  540. X    float tx, ty, ux, uy;
  541. X
  542. X    gw3wc(&cxx,&cxy,&cyx,&cyy,&cyz);
  543. X    gdom(&xmin,&xmax,&ymin,&ymax);
  544. X    grange(&zscale,&zmin,&zmax);
  545. X
  546. X    if (cxx >= 0.0 && cxy <= 0.0)  {
  547. X        /* Get x, y coordinates of legs and plot */
  548. X        if (opt != 1) {
  549. X            for (i=0; i<nx; i++)  {
  550. X                tx = w3wcx(*(x+i),*y,zmin);
  551. X                ty = w3wcy(*(x+i),*y,zmin);
  552. X                ux = w3wcx(*(x+i),*y,*(z+i*ly));
  553. X                uy = w3wcy(*(x+i),*y,*(z+i*ly));
  554. X                pljoin(tx,ty,ux,uy);
  555. X            }
  556. X        }
  557. X
  558. X        if (opt != 2) {
  559. X            for (i=0; i<ny; i++)  {
  560. X                tx = w3wcx(*x,*(y+i),zmin);
  561. X                ty = w3wcy(*x,*(y+i),zmin);
  562. X                ux = w3wcx(*x,*(y+i),*(z+i));
  563. X                uy = w3wcy(*x,*(y+i),*(z+i));
  564. X                pljoin(tx,ty,ux,uy);
  565. X            }
  566. X        }
  567. X    }
  568. X    else if(cxx <= 0.0  && cxy <= 0.0)  {
  569. X        if (opt != 1 )  {
  570. X            for (i=0; i<nx; i++)  {
  571. X                tx = w3wcx(*(x+i),*(y+ny-1),zmin);
  572. X                ty = w3wcy(*(x+i),*(y+ny-1),zmin);
  573. X                ux = w3wcx(*(x+i),*(y+ny-1),*(z+i*ly+ny-1));
  574. X                uy = w3wcy(*(x+i),*(y+ny-1),*(z+i*ly+ny-1));
  575. X                pljoin(tx,ty,ux,uy);
  576. X            }
  577. X        }
  578. X
  579. X        if (opt != 2)  {
  580. X            for (i=0; i<ny; i++)  {
  581. X                tx = w3wcx(*x,*(y+i),zmin);
  582. X                ty = w3wcy(*x,*(y+i),zmin);
  583. X                ux = w3wcx(*x,*(y+i),*(z+i));
  584. X                uy = w3wcy(*x,*(y+i),*(z+i));
  585. X                pljoin(tx,ty,ux,uy);
  586. X            }
  587. X        }
  588. X    }
  589. X    else if(cxx <= 0.0  && cxy >= 0.0)  {
  590. X        if (opt != 1)  {
  591. X            for (i=0; i<nx; i++)  {
  592. X                tx = w3wcx(*(x+i),*(y+ny-1),zmin);
  593. X                ty = w3wcy(*(x+i),*(y+ny-1),zmin);
  594. X                ux = w3wcx(*(x+i),*(y+ny-1),*(z+i*ly+ny-1));
  595. X                uy = w3wcy(*(x+i),*(y+ny-1),*(z+i*ly+ny-1));
  596. X                pljoin(tx,ty,ux,uy);
  597. X            }
  598. X        }
  599. X
  600. X        if (opt != 2)  {
  601. X            for (i=0; i<ny; i++)  {
  602. X                tx = w3wcx(*(x+nx-1),*(y+i),zmin);
  603. X                ty = w3wcy(*(x+nx-1),*(y+i),zmin);
  604. X                ux = w3wcx(*(x+nx-1),*(y+i),*(z+(nx-1)*ly+i));
  605. X                uy = w3wcy(*(x+nx-1),*(y+i),*(z+(nx-1)*ly+i));
  606. X                pljoin(tx,ty,ux,uy);
  607. X            }
  608. X        }
  609. X    }
  610. X    else if(cxx >= 0.0  && cxy >= 0.0)  {
  611. X        if (opt != 1)  {
  612. X            for (i=0; i<nx; i++)  {
  613. X                tx = w3wcx(*(x+i),*y,zmin);
  614. X                ty = w3wcy(*(x+i),*y,zmin);
  615. X                ux = w3wcx(*(x+i),*y,*(z+i*ly));
  616. X                uy = w3wcy(*(x+i),*y,*(z+i*ly));
  617. X                pljoin(tx,ty,ux,uy);
  618. X            }
  619. X        }
  620. X
  621. X        if (opt != 2)  {
  622. X            for (i=0; i<ny; i++)  {
  623. X                tx = w3wcx(*(x+nx-1),*(y+i),zmin);
  624. X                ty = w3wcy(*(x+nx-1),*(y+i),zmin);
  625. X                ux = w3wcx(*(x+nx-1),*(y+i),*(z+(nx-1)*ly+i));
  626. X                uy = w3wcy(*(x+nx-1),*(y+i),*(z+(nx-1)*ly+i));
  627. X                pljoin(tx,ty,ux,uy);
  628. X            }
  629. X        }
  630. X    }
  631. X}
  632. SHAR_EOF
  633. echo "extracting plsmaj.c"
  634. sed 's/^X//' << \SHAR_EOF > plsmaj.c
  635. X#include "plplot.h"
  636. X
  637. Xvoid plsmaj(def,scale)
  638. Xfloat def,scale;
  639. X{
  640. X    float defalt, ht;
  641. X
  642. X    if (def != 0.0)
  643. X       smaj(def,scale*def);
  644. X    else {
  645. X       gmaj(&defalt,&ht);
  646. X       smaj(defalt,scale*defalt);
  647. X    }
  648. X}
  649. SHAR_EOF
  650. echo "extracting plsmin.c"
  651. sed 's/^X//' << \SHAR_EOF > plsmin.c
  652. X#include "plplot.h"
  653. X
  654. Xvoid plsmin(def,scale)
  655. Xfloat def, scale;
  656. X{
  657. X    float defalt, ht;
  658. X    if (def !=  0.0) 
  659. X       smin(def,scale*def);
  660. X    else {
  661. X       gmin(&defalt,&ht);
  662. X       smin(defalt,scale*defalt);
  663. X    }
  664. X}
  665. SHAR_EOF
  666. echo "extracting plssym.c"
  667. sed 's/^X//' << \SHAR_EOF > plssym.c
  668. X#include "plplot.h"
  669. X
  670. Xvoid plssym(def,scale)
  671. Xfloat def,scale;
  672. X{
  673. X    float defalt,ht;
  674. X
  675. X    if (def != 0.0) 
  676. X       ssym(def,scale*def);
  677. X    else {
  678. X       gsym(&defalt,&ht);
  679. X       ssym(defalt,scale*defalt);
  680. X    }
  681. X}
  682. SHAR_EOF
  683. echo "extracting plstar.c"
  684. sed 's/^X//' << \SHAR_EOF > plstar.c
  685. X#include "plplot.h"
  686. X#include "declare.h"
  687. X#include <stdio.h>
  688. X
  689. X/* Asks for number of plotting device, and call plbeg to divide the */
  690. X/* page into nx by ny subpages */
  691. X
  692. Xstatic int mk=0, sp=0;
  693. X
  694. Xvoid plstar(nx,ny)
  695. Xint nx, ny;
  696. X{
  697. X   int dev,lev;
  698. X
  699. X   glev(&lev);
  700. X   if (lev != 0) plend();
  701. X      
  702. X   printf("\nPlotting Options:");
  703. X   printf("\n < 1> Amiga");
  704. X   printf("\n < 2> LaserJet II file    (landscape)");
  705. X   printf("\n < 3> LaserJet II file    (portrait)");
  706. X   printf("\n < 4> imPRESS     file    (landscape)");
  707. X   printf("\n < 5> imPRESS     file    (portrait)");
  708. X   printf("\n < 6> Tektronix   file    (landscape)");
  709. X   printf("\n < 7> Tektronix   file    (portrait)");
  710. X   printf("\n");
  711. X   printf("\nEnter device number: ");
  712. X   scanf("%d",&dev);
  713. X   while(getchar() != '\n') /* Read all of line including new line char */
  714. X       ;
  715. X   plbeg(dev,nx,ny);
  716. X}
  717. X
  718. X/* Initializes the graphics device "dev"  */
  719. Xvoid grbeg(dev)
  720. Xint dev;
  721. X{
  722. X   int termin, phyxmi, phyxma, phyymi, phyyma;
  723. X   void grinit(), grclr(), grcol(), grgra();
  724. X
  725. X   /* Set up device specific stuff */
  726. X
  727. X   /* Use setpxl to set the device dots per mm in the x and y directions */
  728. X   /* dpmmx = dots/mm in x direction (float) */
  729. X   /* dpmmy = dots/mm in y direction (float) */
  730. X   /* setpxl(dpmmx,dpmmy); */
  731. X
  732. X   /* PLPLOT assumes that the plot origin is in the lower left corner */
  733. X   /* with y increasing upward and x increasing to the right */
  734. X   /* Use setphy to specify how PLPLOT should translate plotting coords */
  735. X   /* to device coords */
  736. X   /* xmindev = minimum x device coordinate (int) */
  737. X   /* xmaxdev = maximum x device coordinate (int) */
  738. X   /* ymindev = minimum y device coordinate (int) */
  739. X   /* ymaxdev = maximum y device coordinate (int) */
  740. X   /* setphy(xmindev,xmaxdev,ymindev,ymaxdev); */
  741. X
  742. X   if (dev == 1) {
  743. X     setpxl(2.52,2.25);
  744. X     setphy(0,639,0,399);
  745. X     termin = 1;
  746. X   }
  747. X   else if (dev == 2) {
  748. X       setpxl(5.905,5.905);  /* 150 dpi mode */
  749. X       termin = 0;
  750. X       setphy(0,1409,0,1103);
  751. X   }
  752. X   else if (dev == 3) {
  753. X       setpxl(5.905,5.905);  /* 150 dpi mode */
  754. X       termin = 0;
  755. X       setphy(0,1103,1409,0);
  756. X   }
  757. X   else if (dev == 4) {
  758. X       setpxl(11.81,11.81);  /* 300 dpi */
  759. X       termin = 0;
  760. X       setphy(0,2999,0,2249);
  761. X   }
  762. X   else if (dev == 5) {
  763. X       setpxl(11.81,11.81);  /* 300 dpi */
  764. X       termin = 0;
  765. X       setphy(2249,0,0,2999);
  766. X   }
  767. X   else if (dev == 6 )  {
  768. X       setpxl(4.771,4.653);
  769. X       termin = 0;
  770. X       setphy(0,1023,0,779);
  771. X   }
  772. X   else if (dev == 7)  {
  773. X       setpxl(4.653,4.771);
  774. X       termin = 0;
  775. X       setphy(779,0,0,1023);
  776. X   }
  777. X   else {
  778. X     printf("\nUnknown output device\n");
  779. X     exit(1);
  780. X   }
  781. X
  782. X   sdev(dev,termin,0);
  783. X   grinit();
  784. X
  785. X   /* Set default sizes, fonts, and colors */
  786. X   plschr(4.0,1.0);
  787. X   plssym(4.0,1.0);
  788. X   plsmaj(3.0,1.0);
  789. X   plsmin(1.5,1.0);
  790. X   satt(1,1);
  791. X
  792. X   /* Switch to graphics mode and clear screen */
  793. X   grgra();
  794. X   grclr();
  795. X   grcol();
  796. X   plstyl(0,&mk,&sp);
  797. X      
  798. X   gphy(&phyxmi,&phyxma,&phyymi,&phyyma);
  799. X   sclp(phyxmi,phyxma,phyymi,phyyma);
  800. X}
  801. X
  802. X/* Clears the graphics screen */
  803. Xvoid grclr()
  804. X{
  805. X      if (device == 1)
  806. X        amiclr();
  807. X      else if (device == 2 || device == 3)
  808. X        jetclr();
  809. X      else if (device == 4 || device == 5)
  810. X        impclr();
  811. X      else if (device == 6 || device == 7)
  812. X        tekclr();
  813. X}
  814. X
  815. X/* Sets up the line colour to value in global variable "colour" */
  816. Xvoid grcol()
  817. X{
  818. X      if (device == 1)
  819. X        amicol(colour);
  820. X}
  821. X
  822. X/* Initializes the graphics device */
  823. Xvoid grinit()
  824. X{
  825. X      if (device == 1)
  826. X        amiini();
  827. X      else if (device == 2 || device == 3)
  828. X        jetini();
  829. X      else if (device == 4 || device == 5)
  830. X        impini();
  831. X      else if (device == 6 || device == 7)
  832. X        tekini();
  833. X}
  834. X
  835. X/* Switches to graphics mode */
  836. Xvoid grgra()
  837. X{
  838. X      if (device == 1)
  839. X        amigra();
  840. X      else if (device == 2 || device == 3)
  841. X        jetgra();
  842. X      else if (device == 4 || device == 5)
  843. X        impgra();
  844. X      else if (device == 6 || device == 7)
  845. X        tekgra();
  846. X
  847. X      graphx = 1;
  848. X}
  849. X
  850. X/* Draws a line from (x1,x2) to (x2,y2), used by genlin() */
  851. X/* Notice how x and y are swapped to switch from the default */
  852. X/* orientation */
  853. Xvoid grline(x1,y1,x2,y2)
  854. Xint x1,y1,x2,y2;
  855. X{
  856. X      if (device == 1)
  857. X        amilin(x1,y1,x2,y2);
  858. X      else if (device == 2)
  859. X        jetlin(y1,x1,y2,x2);
  860. X      else if (device == 3)
  861. X        jetlin(x1,y1,x2,y2);
  862. X      else if (device == 4)
  863. X        implin(x1,y1,x2,y2);
  864. X      else if (device == 5)
  865. X        implin(y1,x1,y2,x2);
  866. X      else if (device == 6)
  867. X        teklin(x1,y1,x2,y2);
  868. X      else if (device == 7)
  869. X        teklin(y1,x1,y2,x2);
  870. X}
  871. X
  872. X/* Switches to text mode */
  873. Xvoid grtext()
  874. X{
  875. X      if (device == 1)
  876. X        amitex();
  877. X      else if (device == 2 || device == 3)
  878. X        jettex();
  879. X      else if (device == 4 || device == 5)
  880. X        imptex();
  881. X      else if (device == 6 || device == 7)
  882. X        tektex();
  883. X
  884. X      graphx = 0;
  885. X}
  886. X
  887. X/* Called by plend to tidy up graphics device */
  888. Xvoid grtidy()
  889. X{
  890. X      if (device == 1)
  891. X        amitid();
  892. X      else if (device == 2 || device == 3)
  893. X        jettid();
  894. X      else if (device == 4 || device == 5)
  895. X        imptid();
  896. X      else if (device == 6 || device == 7)
  897. X        tektid();
  898. X}
  899. SHAR_EOF
  900. echo "extracting plstik.c"
  901. sed 's/^X//' << \SHAR_EOF > plstik.c
  902. X/* Draws a slanting tick at position (mx,my) (measured in mm) of */
  903. X/* vector length (dx,dy) */
  904. X
  905. X#include "plplot.h"
  906. X
  907. Xvoid plstik(mx,my,dx,dy)
  908. Xfloat mx, my, dx, dy;
  909. X{
  910. X      draphy(mmpcx(mx),mmpcy(my));
  911. X      draphy(mmpcx(mx+dx),mmpcy(my+dy));
  912. X      draphy(mmpcx(mx),mmpcy(my));
  913. X}
  914. SHAR_EOF
  915. echo "extracting plstr.c"
  916. sed 's/^X//' << \SHAR_EOF > plstr.c
  917. X/* Prints out a "string" at reference position with physical         */
  918. X/* coordinates (refx,refy). The coordinates of the vectors defining  */
  919. X/* the string are passed through the linear mapping defined by the   */
  920. X/* 2 x 2 matrix xform() before being plotted.                        */
  921. X/* The reference position is at the left-hand edge of the string. If */
  922. X/* base = 1, it is aligned with the baseline of the string. If       */
  923. X/* base = 0, it is aligned with the centre of the character box.     */
  924. X
  925. X/* Note, all calculations are done in terms of millimetres. These */
  926. X/* are scaled as necessary before plotting the string on the page */
  927. X
  928. X#include "plplot.h"
  929. X#include <math.h>
  930. X
  931. Xvoid plstr(base,xform,refx,refy,string)
  932. Xint base, refx, refy;
  933. Xchar *string;
  934. Xfloat xform[4];
  935. X{
  936. X      int symbol[256];
  937. X      short int xygrid[300];
  938. X      int ch, cx, cy, i, k, length, level, penup;
  939. X      int xbase, ybase, ydisp, lx, ly, style;
  940. X      int oline, uline;
  941. X      float width, xorg, yorg, x, y, def, ht, dscale, scale;
  942. X      float xscl, xoff, yscl, yoff;
  943. X   
  944. X      width = 0.0;
  945. X      oline = 0;
  946. X      uline = 0;
  947. X
  948. X      gchr(&def,&ht);
  949. X      dscale = 0.05*ht;
  950. X      scale = dscale;
  951. X      gmp(&xscl,&xoff,&yscl,&yoff);
  952. X
  953. X/* Line style must be continuous */
  954. X
  955. X      gnms(&style);
  956. X      snms(0);
  957. X      
  958. X      pldeco(symbol,&length,string);
  959. X      xorg = 0.0;
  960. X      yorg = 0.0;
  961. X      level = 0;
  962. X      for (i=0; i<length; i++)  {
  963. X        ch = symbol[i];
  964. X        if (ch == -1) {
  965. X          level = level + 1;
  966. X          yorg = yorg + 16.0 * scale;
  967. X          scale = dscale * pow(0.75,(double)abs(level));
  968. X        }
  969. X        else if (ch == -2) {  
  970. X          level = level - 1;
  971. X          scale = dscale * pow(0.75,(double)abs(level));
  972. X          yorg = yorg - 16.0 * scale;
  973. X        }
  974. X        else if (ch == -3)
  975. X          xorg = xorg - width * scale;
  976. X        else if (ch == -4)
  977. X          oline = !oline;
  978. X        else if (ch == -5) 
  979. X          uline = !uline;
  980. X        else  {
  981. X          if (plcvec(ch,xygrid)) {
  982. X            xbase = xygrid[3];
  983. X            width = xygrid[4] - xbase;
  984. X            if (base == 0) {
  985. X              ybase = 0;
  986. X              ydisp = xygrid[1];
  987. X            }
  988. X            else  {
  989. X              ybase = xygrid[1];
  990. X              ydisp = 0;
  991. X            }
  992. X            k = 5;
  993. X            penup = 1;
  994. Xlab2:
  995. X              cx = xygrid[k];
  996. X              k = k+1;
  997. X              cy = xygrid[k];
  998. X              k = k+1;
  999. X              if (cx == -64 && cy == -64) goto lab3;
  1000. X              if (cx == -64 && cy == 0) 
  1001. X                penup = 1;
  1002. X              else {
  1003. X                x = xorg + (cx - xbase) * scale;
  1004. X                y = yorg + (cy - ybase) * scale;
  1005. X                lx = refx + round(xscl*(xform[0]*x + xform[1]*y));
  1006. X                ly = refy + round(yscl*(xform[2]*x + xform[3]*y));
  1007. X                if (penup != 0) {
  1008. X                  movphy(lx,ly);
  1009. X                  penup = 0;
  1010. X                }
  1011. X                else
  1012. X                  draphy(lx,ly);
  1013. X              }
  1014. X            goto lab2;
  1015. Xlab3:
  1016. X            if (oline) {
  1017. X              x = xorg;
  1018. X              y = yorg + (30+ydisp)*scale;
  1019. X              lx = refx + round(xscl*(xform[0]*x + xform[1]*y));
  1020. X              ly = refy + round(yscl*(xform[2]*x + xform[3]*y));
  1021. X              movphy(lx,ly);
  1022. X              x = xorg + width*scale;
  1023. X              lx = refx + round(xscl*(xform[0]*x + xform[1]*y));
  1024. X              ly = refy + round(yscl*(xform[2]*x + xform[3]*y));
  1025. X              draphy(lx,ly);
  1026. X            }
  1027. X            if (uline) {
  1028. X              x = xorg;
  1029. X              y = yorg + (-5+ydisp)*scale;
  1030. X              lx = refx + round(xscl*(xform[0]*x + xform[1]*y));
  1031. X              ly = refy + round(yscl*(xform[2]*x + xform[3]*y));
  1032. X              movphy(lx,ly);
  1033. X              x = xorg + width*scale;
  1034. X              lx = refx + round(xscl*(xform[0]*x + xform[1]*y));
  1035. X              ly = refy + round(yscl*(xform[2]*x + xform[3]*y));
  1036. X              draphy(lx,ly);
  1037. X            }
  1038. X            xorg = xorg + width*scale;
  1039. X          }
  1040. X        }
  1041. X      }
  1042. X      snms(style);
  1043. X}
  1044. X
  1045. SHAR_EOF
  1046. echo "extracting plstrl.c"
  1047. sed 's/^X//' << \SHAR_EOF > plstrl.c
  1048. X/* Computes the length of a string in mm, including escape sequences  */
  1049. X
  1050. X#include "plplot.h"
  1051. X#include <math.h>
  1052. X
  1053. Xfloat plstrl(string)
  1054. Xchar *string;
  1055. X{
  1056. X      int symbol[256];
  1057. X      short int xygrid[300];
  1058. X      int ch, i, length, level;
  1059. X      float width, xorg, dscale, scale, def, ht;
  1060. X      float xscl, xoff, yscl, yoff;
  1061. X
  1062. X      width = 0.0;
  1063. X      gchr(&def,&ht);
  1064. X      dscale = 0.05*ht;
  1065. X      scale = dscale;
  1066. X      gmp(&xscl,&xoff,&yscl,&yoff);
  1067. X
  1068. X      pldeco(symbol,&length,string);
  1069. X      xorg = 0.0;
  1070. X      level = 0;
  1071. X      for (i=0; i<length; i++) {
  1072. X        ch = symbol[i];
  1073. X        if (ch == -1) {
  1074. X          level = level + 1;
  1075. X          scale = dscale * pow(0.75,(double)abs(level));
  1076. X        }
  1077. X        else if (ch == -2) {  
  1078. X          level = level - 1;
  1079. X          scale = dscale * pow(0.75,(double)abs(level));
  1080. X        }
  1081. X        else if (ch == -3) 
  1082. X          xorg = xorg - width * scale;
  1083. X        else if (ch == -4 || ch == -5) 
  1084. X          ;
  1085. X        else {
  1086. X          if (plcvec(ch,xygrid)) {
  1087. X            width = xygrid[4] - xygrid[3];
  1088. X            xorg = xorg + width*scale;
  1089. X          }
  1090. X        }
  1091. X      }
  1092. X      return(xorg);
  1093. X}
  1094. SHAR_EOF
  1095. echo "extracting plstyl.c"
  1096. sed 's/^X//' << \SHAR_EOF > plstyl.c
  1097. X/* Set up a new line style of "nels" elements, with mark and space */
  1098. X/* lengths given by arrays "mk" and "sp". */
  1099. X
  1100. X#include "plplot.h"
  1101. X#include "declare.h"
  1102. X
  1103. Xvoid plstyl(nels,mk,sp)
  1104. Xint nels,mk[],sp[];
  1105. X{
  1106. X    int i;
  1107. X
  1108. X    if ((nels < 0) || (nels > 10)) {
  1109. X      fatal("Broken lines cannot have <0 or >10 elements");
  1110. X    }
  1111. X
  1112. X    nms = nels;
  1113. X    for (i=0; i<nels; i++) {
  1114. X        mark[i] = mk[i];
  1115. X        space[i] = sp[i];
  1116. X        if ((mk[i] < 0) || (sp[i] < 0))
  1117. X            fatal("Mark and space lengths must be > 0 in PLSTYL");
  1118. X    }
  1119. X
  1120. X    curel = 0;
  1121. X    pendn = 1;
  1122. X    timecnt = 0;
  1123. X    alarm = mark[curel];
  1124. X}
  1125. X
  1126. X/* Updates line style variables, called whenever alarm goes off */
  1127. X
  1128. Xvoid plupd()
  1129. X{
  1130. X    while ( timecnt >= alarm ) {
  1131. X        if (pendn != 0) {
  1132. X            pendn = 0;
  1133. X            timecnt = timecnt - alarm;
  1134. X            alarm = space[curel];
  1135. X        }
  1136. X        else {
  1137. X            pendn = 1;
  1138. X            timecnt = timecnt - alarm;
  1139. X            curel = curel + 1;
  1140. X            if (curel >= nms) curel = 0;
  1141. X            alarm = mark[curel];
  1142. X        }
  1143. X    }
  1144. X}
  1145. X
  1146. X
  1147. SHAR_EOF
  1148. echo "extracting plsvpa.c"
  1149. sed 's/^X//' << \SHAR_EOF > plsvpa.c
  1150. X/* Sets the edges of the viewport to the specified absolute          */
  1151. X/* coordinates (mm), measured with respect to the current subpage    */
  1152. X/* boundaries                                                        */
  1153. X
  1154. X#include "plplot.h"
  1155. X
  1156. Xvoid plsvpa(xmin,xmax,ymin,ymax)
  1157. Xfloat xmin, xmax, ymin, ymax;
  1158. X{
  1159. X
  1160. X    int nx, ny, cs;
  1161. X    float sxmin, symin;
  1162. X    float spdxmi, spdxma, spdymi, spdyma;
  1163. X    float vpdxmi, vpdxma, vpdymi, vpdyma;
  1164. X
  1165. X    int level;
  1166. X
  1167. X    glev(&level);
  1168. X    if (level<1) fatal("Please call PLSTAR before calling PLSVPA.");
  1169. X    if((xmin>=xmax)||(ymin>=ymax)||(xmin<0.)||(ymin<0.))
  1170. X        fatal("Invalid limits in PLSVPA.");
  1171. X
  1172. X    gsub(&nx,&ny,&cs);
  1173. X    if ((cs<=0) || (cs>(nx*ny)))
  1174. X        fatal("Please call PLADV or PLENV to go to a subpage.");
  1175. X
  1176. X    gspd(&spdxmi,&spdxma,&spdymi,&spdyma);
  1177. X    sxmin = dcmmx(spdxmi);
  1178. X    symin = dcmmy(spdymi);
  1179. X
  1180. X    vpdxmi = mmdcx(sxmin+xmin);
  1181. X    vpdxma = mmdcx(sxmin+xmax);
  1182. X    vpdymi = mmdcy(symin+ymin);
  1183. X    vpdyma = mmdcy(symin+ymax);
  1184. X    
  1185. X    svpd(vpdxmi,vpdxma,vpdymi,vpdyma);
  1186. X    svpp(dcpcx(vpdxmi),dcpcx(vpdxma),dcpcy(vpdymi),dcpcy(vpdyma));
  1187. X    sclp(dcpcx(vpdxmi),dcpcx(vpdxma),dcpcy(vpdymi),dcpcy(vpdyma));
  1188. X    slev(2);
  1189. X}
  1190. X
  1191. SHAR_EOF
  1192. echo "extracting plsym.c"
  1193. sed 's/^X//' << \SHAR_EOF > plsym.c
  1194. X/* Plots single precision array y against x for n points using */
  1195. X/* Hershey symbol "code" */
  1196. X
  1197. X#include "plplot.h"
  1198. X
  1199. Xvoid plsym(n,x,y,code)
  1200. Xint n, code;
  1201. Xfloat x[],y[];
  1202. X{
  1203. X      int i;
  1204. X
  1205. X      int level;
  1206. X      glev(&level);
  1207. X      if (level < 3) fatal("Please set up window before calling PLSYM.");
  1208. X      if (code < 0) fatal("Invalid code in PLSYM.");
  1209. X
  1210. X      for (i=0; i<n; i++) 
  1211. X        plsym1(x[i],y[i],code);
  1212. X}
  1213. SHAR_EOF
  1214. echo "extracting plsym1.c"
  1215. sed 's/^X//' << \SHAR_EOF > plsym1.c
  1216. X#include "plplot.h"
  1217. X
  1218. Xvoid plsym1(x,y,code)
  1219. Xfloat x,y;
  1220. Xint code;
  1221. X{
  1222. X      plhrsh(code,wcpcx(x),wcpcy(y));
  1223. X}
  1224. SHAR_EOF
  1225. echo "extracting plt3zz.c"
  1226. sed 's/^X//' << \SHAR_EOF > plt3zz.c
  1227. X/* Draws the next zig-zag line for a 3-d plot. The data is stored in */
  1228. X/* array z(*,ly) as a function of x() and y(). The subarray */
  1229. X/* z(1:nx,1:ny) is plotted out, starting at index (xstar0,ystar0). */
  1230. X/* Depending on the state of "flg0", the sequence of data points */
  1231. X/* sent to plnxtv is altered so as to allow cross-hatch plotting, */
  1232. X/* or plotting parallel to either the x-axis or the y-axis. */
  1233. X
  1234. X#include "plplot.h"
  1235. X
  1236. Xvoid plt3zz(xstar0,ystar0,dx,dy,flg0,init,x,y,z,ly,nx,ny,u,v)
  1237. Xint xstar0, ystar0, dx, dy, flg0, ly, nx, ny, init;
  1238. Xfloat x[], y[], *z;
  1239. Xint u[], v[];
  1240. X{
  1241. X      int flag;
  1242. X      int n;
  1243. X      int xstart, ystart;
  1244. X
  1245. X      n = 0;
  1246. X      xstart = xstar0;
  1247. X      ystart = ystar0;
  1248. X      flag = flg0;
  1249. X      
  1250. Xlab1:
  1251. X      if (1 <= xstart && xstart <= nx && 1 <= ystart && ystart <= ny) {
  1252. X        u[n] = wcpcx(w3wcx(x[xstart-1],y[ystart-1],
  1253. X                      *(z+(xstart-1)*ly+(ystart-1))));
  1254. X        v[n] = wcpcy(w3wcy(x[xstart-1],y[ystart-1],
  1255. X                      *(z+(xstart-1)*ly+(ystart-1))));
  1256. X        if (flag == -3) {
  1257. X          ystart = ystart + dy;
  1258. X          flag = -flag;
  1259. X        }
  1260. X        else if (flag == -2) 
  1261. X          ystart = ystart + dy;
  1262. X        else if (flag == -1) {
  1263. X          ystart = ystart + dy;
  1264. X          flag = 1;
  1265. X        }
  1266. X        else if (flag == 1)
  1267. X          xstart = xstart + dx;
  1268. X        else if (flag == 2)  {
  1269. X          xstart = xstart + dx;
  1270. X          flag = -2;
  1271. X        }
  1272. X        else if (flag == 3) {
  1273. X          xstart = xstart + dx;
  1274. X          flag = -flag;
  1275. X        }
  1276. X        n = n+1;
  1277. X        goto lab1;
  1278. X      }
  1279. X
  1280. X      if (flag == 1 || flag == -2) {
  1281. X        if (flag == 1) {
  1282. X          xstart = xstart - dx;
  1283. X          ystart = ystart + dy;
  1284. X        }
  1285. X        else if (flag == -2) {
  1286. X          ystart = ystart - dy;
  1287. X          xstart = xstart + dx;
  1288. X        }
  1289. X
  1290. X        if (1 <= xstart && xstart <= nx  && 1 <= ystart && ystart <= ny) {
  1291. X          u[n] = wcpcx(w3wcx(x[xstart-1],y[ystart-1],
  1292. X                       *(z+(xstart-1)*ly+(ystart-1))));
  1293. X          v[n] = wcpcy(w3wcy(x[xstart-1],y[ystart-1],
  1294. X                       *(z+(xstart-1)*ly+(ystart-1))));
  1295. X          n = n+1;
  1296. X        }
  1297. X
  1298. X      }        
  1299. X      plnxtv(u,v,n,init);
  1300. X}
  1301. SHAR_EOF
  1302. echo "extracting pltext.c"
  1303. sed 's/^X//' << \SHAR_EOF > pltext.c
  1304. X/* Switches back to text mode */
  1305. X
  1306. X#include "plplot.h"
  1307. X
  1308. Xvoid pltext()
  1309. X{
  1310. X      int dev,term,gra,level;
  1311. X
  1312. X      glev(&level);
  1313. X      if (level < 1) fatal("Please call PLSTAR before calling PLTEXT.");
  1314. X
  1315. X      gdev(&dev,&term,&gra);
  1316. X      if (term != 0) beepw();
  1317. X      grtext();
  1318. X}
  1319. SHAR_EOF
  1320. echo "extracting plvpor.c"
  1321. sed 's/^X//' << \SHAR_EOF > plvpor.c
  1322. X/* Sets the edges of the viewport to the specified normalized subpage */
  1323. X/* coordinates */
  1324. X
  1325. X#include "plplot.h"
  1326. X
  1327. Xvoid plvpor(xmin, xmax, ymin, ymax)
  1328. Xfloat xmin, xmax, ymin, ymax;
  1329. X{
  1330. X    float spdxmi, spdxma, spdymi, spdyma;
  1331. X    float vpdxmi, vpdxma, vpdymi, vpdyma;
  1332. X    int vppxmi, vppxma, vppymi, vppyma;
  1333. X    
  1334. X    int nx, ny, cs;
  1335. X
  1336. X    int level;
  1337. X
  1338. X    glev(&level);
  1339. X    if (level < 1) fatal("Please call PLSTAR before calling PLVPOR.");
  1340. X    if((xmin>=xmax)||(ymin>=ymax)||(xmin<0.)||
  1341. X       (ymin<0.)||(xmax>1.)||(ymax>1.))
  1342. X        fatal("Invalid limits in PLSVPA.");
  1343. X
  1344. X    gsub(&nx,&ny,&cs);
  1345. X    if ((cs<=0) || (cs>(nx*ny)))
  1346. X        fatal("Please call PLADV or PLENV to go to a subpage.");
  1347. X    gspd(&spdxmi,&spdxma,&spdymi,&spdyma);
  1348. X    vpdxmi = spdxmi + (spdxma - spdxmi) * xmin;
  1349. X    vpdxma = spdxmi + (spdxma - spdxmi) * xmax;
  1350. X    vpdymi = spdymi + (spdyma - spdymi) * ymin;
  1351. X    vpdyma = spdymi + (spdyma - spdymi) * ymax;
  1352. X    svpd(vpdxmi,vpdxma,vpdymi,vpdyma);
  1353. X
  1354. X    vppxmi = dcpcx(vpdxmi);
  1355. X    vppxma = dcpcx(vpdxma);
  1356. X    vppymi = dcpcy(vpdymi);
  1357. X    vppyma = dcpcy(vpdyma);
  1358. X    svpp(vppxmi,vppxma,vppymi,vppyma);
  1359. X    sclp(vppxmi,vppxma,vppymi,vppyma);
  1360. X    slev(2);
  1361. X}
  1362. SHAR_EOF
  1363. echo "extracting plvsta.c"
  1364. sed 's/^X//' << \SHAR_EOF > plvsta.c
  1365. X/* Defines a "standard" viewport with seven character heights for   */
  1366. X/* the left margin and four character heights everywhere else       */
  1367. X
  1368. X#include "plplot.h"
  1369. X                                                                   
  1370. Xvoid plvsta()
  1371. X{
  1372. X    float xmin, xmax, ymin, ymax;
  1373. X    float chrdef, chrht, spdxmi, spdxma, spdymi, spdyma;
  1374. X
  1375. X    int level;
  1376. X
  1377. X    glev(&level);
  1378. X    if (level < 1) fatal("Please call PLSTAR before calling PLVSTA.");
  1379. X
  1380. X    gchr(&chrdef,&chrht);
  1381. X    gspd(&spdxmi,&spdxma,&spdymi,&spdyma);
  1382. X
  1383. X/*  Find out position of subpage boundaries in millimetres, reduce by */
  1384. X/*  the desired border, and convert back into normalized subpage */
  1385. X/*  coordinates */
  1386. X
  1387. X    xmin = dcscx(mmdcx(dcmmx(spdxmi) + 7 * chrht));
  1388. X    xmax = dcscx(mmdcx(dcmmx(spdxma) - 4 * chrht));
  1389. X    ymin = dcscy(mmdcy(dcmmy(spdymi) + 4 * chrht));
  1390. X    ymax = dcscy(mmdcy(dcmmy(spdyma) - 4 * chrht));
  1391. X
  1392. X    plvpor(xmin,xmax,ymin,ymax);
  1393. X}
  1394. SHAR_EOF
  1395. echo "extracting plw3d.c"
  1396. sed 's/^X//' << \SHAR_EOF > plw3d.c
  1397. X/* Set up a window for three-dimensional plotting. The data are mapped */
  1398. X/* into a box with world coordinate size "basex" by "basey" by "height", */
  1399. X/* with the base being symmetrically positioned about zero. Thus */
  1400. X/* the mapping between data 3-d and world 3-d coordinates is given by: */
  1401. X
  1402. X/*   x = xmin   =>   wx = -0.5*basex */
  1403. X/*   x = xmax   =>   wx =  0.5*basex */
  1404. X/*   y = ymin   =>   wy = -0.5*basey */
  1405. X/*   y = ymax   =>   wy =  0.5*basey */
  1406. X/*   z = zmin   =>   wz =  0.0 */
  1407. X/*   z = zmax   =>   wz =  height */
  1408. X
  1409. X/* The world coordinate box is then viewed from position "alt"-"az", */
  1410. X/* measured in degrees. For proper operation, 0 <= alt <= 90 degrees, */
  1411. X/* but az can be any value. */
  1412. X
  1413. X#include "plplot.h"
  1414. X#include <math.h>
  1415. X
  1416. X#define  dtr   0.01745329252
  1417. X
  1418. Xvoid plw3d(basex,basey,height,xmin0,xmax0,ymin0,ymax0,zmin0,zmax0,alt,az)
  1419. Xfloat basex, basey, height, xmin0, xmax0, ymin0, ymax0, zmin0, zmax0;
  1420. Xfloat alt, az;
  1421. X{
  1422. X      float xmin, xmax, ymin, ymax, zmin, zmax, d;
  1423. X      float cx, cy, saz, caz, salt, calt, zscale;
  1424. X
  1425. X      int level;
  1426. X      glev(&level);
  1427. X      if (level < 3) fatal("Please set up 2-d window before calling PLW3D.");
  1428. X      if (basex <= 0.0 || basey <= 0.0 || height <= 0.0)
  1429. X              fatal("Invalid world coordinate boxsize in PLW3D.");
  1430. X      if (xmin0 == xmax0 || ymin0 == ymax0 || zmin0 == zmax0)
  1431. X              fatal("Invalid axis range in PLW3D.");
  1432. X      if (alt<0.0 || alt>90.0)
  1433. X              fatal("Altitude must be between 0 and 90 degrees in PLW3D.");
  1434. X
  1435. X      d = 1.0e-5*(xmax0-xmin0);
  1436. X      xmax = xmax0 + d;
  1437. X      xmin = xmin0 - d;
  1438. X      d = 1.0e-5*(ymax0-ymin0);
  1439. X      ymax = ymax0 + d;
  1440. X      ymin = ymin0 - d;
  1441. X      d = 1.0e-5*(zmax0-zmin0);
  1442. X      zmax = zmax0 + d;
  1443. X      zmin = zmin0 - d;
  1444. X      cx = basex/(xmax-xmin);
  1445. X      cy = basey/(ymax-ymin);
  1446. X      zscale = height/(zmax-zmin);
  1447. X      saz = sin(dtr*az);
  1448. X      caz = cos(dtr*az);
  1449. X      salt = sin(dtr*alt);
  1450. X      calt = cos(dtr*alt);
  1451. X      
  1452. X      sdom(xmin,xmax,ymin,ymax);
  1453. X      srange(zscale,zmin,zmax);
  1454. X      sbase(basex,basey,0.5*(xmin+xmax),0.5*(ymin+ymax));
  1455. X
  1456. X      sw3wc(cx*caz,-cy*saz,cx*saz*salt,cy*caz*salt,zscale*calt);
  1457. X}
  1458. X
  1459. SHAR_EOF
  1460. echo "extracting plwind.c"
  1461. sed 's/^X//' << \SHAR_EOF > plwind.c
  1462. X#include "plplot.h"
  1463. X
  1464. Xvoid plwind(xmin,xmax,ymin,ymax)
  1465. Xfloat xmin, xmax, ymin, ymax;
  1466. X{
  1467. X    int vppxmi, vppxma, vppymi, vppyma;
  1468. X    float dx, dy;
  1469. X    float vpwxmi, vpwxma, vpwymi, vpwyma;
  1470. X    float vpxmi, vpxma, vpymi, vpyma;
  1471. X    float wpxscl, wpxoff, wpyscl, wpyoff;
  1472. X    float wmxscl, wmxoff, wmyscl, wmyoff;
  1473. X
  1474. X    int level;
  1475. X
  1476. X    glev(&level);
  1477. X    if (level<2) fatal("Please set up viewport before calling PLWIND.");
  1478. X
  1479. X    gvpp(&vppxmi,&vppxma,&vppymi,&vppyma);
  1480. X    gvpd(&vpxmi,&vpxma,&vpymi,&vpyma);
  1481. X
  1482. X    dx = (xmax-xmin) * 1.0e-5;
  1483. X    dy = (ymax-ymin) * 1.0e-5;
  1484. X
  1485. X    if ((xmin == xmax) || (ymin == ymax))
  1486. X        fatal("Invalid window limits in PLWIND.");
  1487. X   
  1488. X/* The true plot window is made slightly larger than requested so that */
  1489. X/* the end limits will be on the graph  */
  1490. X    svpw(xmin-dx,xmax+dx,ymin-dy,ymax+dy);
  1491. X    gvpw(&vpwxmi,&vpwxma,&vpwymi,&vpwyma);
  1492. X
  1493. X/* Compute the scaling between coordinate systems */
  1494. X
  1495. X    dx = vpwxma - vpwxmi;
  1496. X    dy = vpwyma - vpwymi;
  1497. X    wpxscl  = (vppxma - vppxmi) / dx;
  1498. X    wpxoff  = (xmax * vppxmi - xmin * vppxma) / dx;
  1499. X    wpyscl  = (vppyma - vppymi) / dy;
  1500. X    wpyoff  = (ymax * vppymi - ymin * vppyma) / dy;
  1501. X    swp(wpxscl,wpxoff,wpyscl,wpyoff);
  1502. X
  1503. X    vpxmi = dcmmx(vpxmi);
  1504. X    vpxma = dcmmx(vpxma);
  1505. X    vpymi = dcmmy(vpymi);
  1506. X    vpyma = dcmmy(vpyma);
  1507. X    wmxscl = (vpxma - vpxmi) / dx;
  1508. X    wmxoff = (xmax * vpxmi - xmin * vpxma) / dx;
  1509. X    wmyscl = (vpyma - vpymi) / dy;
  1510. X    wmyoff = (ymax * vpymi - ymin * vpyma) / dy;
  1511. X    swm(wmxscl,wmxoff,wmyscl,wmyoff);
  1512. X
  1513. X    slev(3);
  1514. X}SHAR_EOF
  1515. echo "extracting plxtik.c"
  1516. sed 's/^X//' << \SHAR_EOF > plxtik.c
  1517. X#include "plplot.h"
  1518. X
  1519. Xvoid plxtik(x,y,below,above)
  1520. Xint x, y, below, above;
  1521. X{      
  1522. X      draphy(x,y);
  1523. X      if (below != 0) draphy(x,y-below);
  1524. X      if (above != 0) draphy(x,y+above);
  1525. X      draphy(x,y);
  1526. X}
  1527. SHAR_EOF
  1528. echo "extracting plxybx.c"
  1529. sed 's/^X//' << \SHAR_EOF > plxybx.c
  1530. X/* This draws a sloping line from (wx1,wy1) to (wx2,wy2)             */
  1531. X/*  which represents an axis of a 3-d graph with data values from    */
  1532. X/*  "vmin" to "vmax". Depending on "opt", vertical ticks and/or      */
  1533. X/*  subticks are placed on the line at major tick interval "tick"    */
  1534. X/*  with "nsub" subticks between major ticks. If "tick" and/or       */
  1535. X/*  "nsub" is zero, automatic tick positions are computed            */
  1536. X
  1537. X/* B: Draw box boundary                                              */
  1538. X/* I: Inverts tick marks (i.e. drawn downwards)                      */
  1539. X/* L: Logarithmic axes, major ticks at decades, minor ticks at units */
  1540. X/* N: Write numeric label                                            */
  1541. X/* T: Draw major tick marks                                          */
  1542. X/* S: Draw minor tick marks                                          */
  1543. X/* U: Write label on line                                            */
  1544. X
  1545. X#include "plplot.h"
  1546. X#include <stdio.h>
  1547. X#include <math.h>
  1548. X
  1549. X#define  betw(c,a,b)  ((a <= c && c <= b) || (b <= c && c <= a))
  1550. X
  1551. Xstatic float xlog[8] = 
  1552. X  {0.301030,0.477121,0.602060,0.698970,0.778151,0.845098,0.903090,0.954243};
  1553. X
  1554. Xvoid plxybx(opt,label,wx1,wy1,wx2,wy2,vmin,vmax,tick,nsub,nolast)
  1555. Xchar *opt, *label;
  1556. Xfloat wx1, wy1, wx2, wy2, vmin, vmax, tick;
  1557. Xint nsub, nolast;
  1558. X{
  1559. X      char string[40];
  1560. X      int lb,li,ll,ln,ls,lt,lu;
  1561. X      int major, minor, mode, prec;
  1562. X      int i, i1, i2, i3, i4;
  1563. X      int nsub1;
  1564. X      float xpmm, ypmm, defmaj, defmin, htmaj, htmin, tick1;
  1565. X      float pos, tn, tp, temp;
  1566. X      float dwx, dwy, lambda;
  1567. X
  1568. X      dwx = wx2 - wx1;
  1569. X      dwy = wy2 - wy1;
  1570. X
  1571. X/* Tick and subtick sizes in device coords */
  1572. X
  1573. X      gpixmm(&xpmm,&ypmm);
  1574. X      gmaj(&defmaj,&htmaj);
  1575. X      gmin(&defmin,&htmin);
  1576. X      
  1577. X      major=max(round(htmaj*ypmm),1);
  1578. X      minor=max(round(htmin*ypmm),1);
  1579. X
  1580. X      tick1=tick;
  1581. X      nsub1=nsub;
  1582. X
  1583. X      lb=strpos(opt,'B')!=-1||strpos(opt,'b')!=-1;
  1584. X      li=strpos(opt,'I')!=-1||strpos(opt,'i')!=-1;
  1585. X      ll=strpos(opt,'L')!=-1||strpos(opt,'l')!=-1;
  1586. X      ln=strpos(opt,'N')!=-1||strpos(opt,'n')!=-1;
  1587. X      ls=strpos(opt,'S')!=-1||strpos(opt,'s')!=-1;
  1588. X      lt=strpos(opt,'T')!=-1||strpos(opt,'t')!=-1;
  1589. X      lu=strpos(opt,'U')!=-1||strpos(opt,'u')!=-1;
  1590. X
  1591. X      if (lu) plxytx(wx1,wy1,wx2,wy2,3.2,0.5,0.5,label);
  1592. X      if (!lb) return;
  1593. X   
  1594. X      if (ll) tick1 = 1.0;
  1595. X      if (lt) pldtik(vmin,vmax,&tick1,&nsub1,&mode,&prec);
  1596. X
  1597. X      if (li) {
  1598. X        i1 = minor;
  1599. X        i2 = 0;
  1600. X        i3 = major;
  1601. X        i4 = 0;
  1602. X      }
  1603. X      else  {
  1604. X        i1 = 0;
  1605. X        i2 = minor;
  1606. X        i3 = 0;
  1607. X        i4 = major;
  1608. X      }  
  1609. X
  1610. X/* Draw the line */
  1611. X
  1612. X      movwor(wx1,wy1);
  1613. X      if (lt) {
  1614. X        tp=tick1*floor(vmin/tick1);
  1615. Xlab2:
  1616. X        tn=tp+tick1;
  1617. X        if (ls) {
  1618. X          if (ll) {
  1619. X            for (i=0; i<=7; i++)  {
  1620. X              temp=tp+xlog[i];
  1621. X              if (betw(temp,vmin,vmax)) {
  1622. X                lambda = (temp-vmin)/(vmax-vmin);
  1623. X                plxtik(wcpcx(wx1+lambda*dwx),wcpcy(wy1+lambda*dwy),i1,i2);
  1624. X              }
  1625. X            }
  1626. X          }
  1627. X          else  {
  1628. X            for(i=1; i <= nsub1-1; i++)  {
  1629. X              temp=tp+i*(tn-tp)/nsub1;
  1630. X              if (betw(temp,vmin,vmax)) {
  1631. X                lambda = (temp-vmin)/(vmax-vmin);
  1632. X                plxtik(wcpcx(wx1+lambda*dwx),wcpcy(wy1+lambda*dwy),i1,i2);
  1633. X              }
  1634. X            }
  1635. X          }
  1636. X        }
  1637. X        temp=tn;
  1638. X        if (betw(temp,vmin,vmax)) {
  1639. X          lambda = (temp-vmin)/(vmax-vmin);
  1640. X          plxtik(wcpcx(wx1+lambda*dwx),wcpcy(wy1+lambda*dwy),i3,i4);
  1641. X          tp=tn;
  1642. X          goto lab2;
  1643. X        }
  1644. X      }
  1645. X
  1646. X      drawor(wx2,wy2);
  1647. X
  1648. X/* Label the line */
  1649. X
  1650. X      if (ln && lt) {
  1651. X        tp=tick1*floor(vmin/tick1);
  1652. Xlab82:
  1653. X        tn=tp+tick1;
  1654. X        if (nolast && !betw(tn+tick1,vmin,vmax)) return;
  1655. X        if (betw(tn,vmin,vmax)) {
  1656. X          if (!ll) 
  1657. X            plform(tn,mode,prec,string);
  1658. X          else 
  1659. X            sprintf(string,"10\\u%-d",round(tn));
  1660. X          pos=(tn-vmin)/(vmax-vmin);
  1661. X          if (ln) plxytx(wx1,wy1,wx2,wy2,1.5,pos,0.5,string);
  1662. X          tp=tn;
  1663. X          goto lab82;
  1664. X        }
  1665. X      }
  1666. X}
  1667. SHAR_EOF
  1668. echo "extracting plxytx.c"
  1669. sed 's/^X//' << \SHAR_EOF > plxytx.c
  1670. X/* Prints out text along a sloping axis joining world coordinates */
  1671. X/* (wx1,wy1) to (wx2,wy2). Parameters are as for plmtext          */
  1672. X
  1673. X#include "plplot.h"
  1674. X#include <math.h>
  1675. X
  1676. Xvoid plxytx(wx1,wy1,wx2,wy2,disp,pos,just,text)
  1677. Xfloat wx1,wy1,wx2,wy2,disp,pos,just;
  1678. Xchar *text;
  1679. X{      
  1680. X      int refx, refy;
  1681. X      float shift, cc, ss, def, ht;
  1682. X      float xform[4], diag;
  1683. X      float xscl, xoff, yscl, yoff, wx, wy;
  1684. X   
  1685. X      gchr(&def,&ht);
  1686. X      gwm(&xscl,&xoff,&yscl,&yoff);
  1687. X      cc = xscl * (wx2-wx1);
  1688. X      ss = yscl * (wy2-wy1);
  1689. X      diag = sqrt(cc*cc + ss*ss);
  1690. X      cc = cc/diag;
  1691. X      ss = ss/diag;
  1692. X
  1693. X      xform[0] = cc;
  1694. X      xform[1] = 0.0;
  1695. X      xform[2] = ss;
  1696. X      xform[3] = 1.0;
  1697. X
  1698. X      shift = 0.0;
  1699. X      if (just != 0.0) shift = plstrl(text) * just;
  1700. X      wx = wx1 + pos * (wx2 - wx1);
  1701. X      wy = wy1 + pos * (wy2 - wy1);
  1702. X      
  1703. X      refx = mmpcx(wcmmx(wx) - shift * cc);
  1704. X      refy = mmpcy(wcmmy(wy) - shift * ss - disp * ht);
  1705. X      plstr(0,xform,refx,refy,text);
  1706. X}
  1707. SHAR_EOF
  1708. echo "extracting plytik.c"
  1709. sed 's/^X//' << \SHAR_EOF > plytik.c
  1710. X#include "plplot.h"
  1711. X
  1712. Xvoid plytik(x,y,left,right)
  1713. Xint x, y, left, right;
  1714. X{      
  1715. X      draphy(x,y);
  1716. X      if (left != 0) draphy(x-left,y);
  1717. X      if (right != 0) draphy(x+right,y);
  1718. X      draphy(x,y);
  1719. X}
  1720. SHAR_EOF
  1721. echo "extracting plzbx.c"
  1722. sed 's/^X//' << \SHAR_EOF > plzbx.c
  1723. X/* This draws a vertical line from (wx,wy1) to (wx,wy2)           */
  1724. X/*  which represents the vertical axis of a 3-d graph with data   */
  1725. X/*  values from "vmin" to "vmax". Depending on "opt", ticks and/or*/
  1726. X/*  subticks are placed on the line at major tick interval "tick" */
  1727. X/*  with "nsub" subticks between major ticks. If "tick" and/or    */
  1728. X/*  "nsub" is zero, automatic tick positions are computed         */
  1729. X
  1730. X/* B: Draws left-hand axis*/
  1731. X/* C: Draws right-hand axis*/
  1732. X/* I: Inverts tick marks (i.e. drawn to the left)  */
  1733. X/* L: Logarithmic axes, major ticks at decades, minor ticks at units*/
  1734. X/* M: Write numeric label on right axis*/
  1735. X/* N: Write numeric label on left axis*/
  1736. X/* S: Draw minor tick marks  */
  1737. X/* T: Draw major tick marks  */
  1738. X/* U: Writes left-hand label*/
  1739. X/* V: Writes right-hand label*/
  1740. X
  1741. X#include "plplot.h"
  1742. X#include <stdio.h>
  1743. X#include <math.h>
  1744. X
  1745. X#define betw(c,a,b) ((a <= c && c <= b) || (b <= c && c <= a))
  1746. X
  1747. Xstatic float xlog[8] =
  1748. X  {0.301030,0.477121,0.602060,0.698970,0.778151,0.845098,
  1749. X   0.903090,0.954243};
  1750. X
  1751. Xvoid plzbx(opt,label,right,dx,dy,wx,wy1,wy2,vmin,vmax,tick,nsub)
  1752. Xchar *opt, *label;
  1753. Xfloat dx, dy, wx, wy1, wy2, vmin, vmax, tick;
  1754. Xint nsub, right;
  1755. X{
  1756. X      char string[40];
  1757. X      int lb,lc,li,ll,lm,ln,ls,lt,lu,lv;
  1758. X      int i, mode, prec;
  1759. X      int nsub1;
  1760. X      float xpmm, ypmm, defmaj, defmin, tick1;
  1761. X      float pos, tn, tp, temp;
  1762. X      float dwy, lambda, diag, major, minor, xmajor, xminor;
  1763. X      float ymajor, yminor, dxm, dym, xscl, xoff, yscl, yoff;
  1764. X               
  1765. X      dwy = wy2 - wy1;
  1766. X
  1767. X/* Tick and subtick sizes in device coords */
  1768. X
  1769. X      gpixmm(&xpmm,&ypmm);
  1770. X      gmaj(&defmaj,&major);
  1771. X      gmin(&defmin,&minor);
  1772. X      
  1773. X      tick1=tick;
  1774. X      nsub1=nsub;
  1775. X
  1776. X      lb=strpos(opt,'B') != -1 || strpos(opt,'b') != -1;
  1777. X      lc=strpos(opt,'C') != -1 || strpos(opt,'c') != -1;
  1778. X      li=strpos(opt,'I') != -1 || strpos(opt,'i') != -1;
  1779. X      ll=strpos(opt,'L') != -1 || strpos(opt,'l') != -1;
  1780. X      lm=strpos(opt,'M') != -1 || strpos(opt,'m') != -1;
  1781. X      ln=strpos(opt,'N') != -1 || strpos(opt,'n') != -1;
  1782. X      ls=strpos(opt,'S') != -1 || strpos(opt,'s') != -1;
  1783. X      lt=strpos(opt,'T') != -1 || strpos(opt,'t') != -1;
  1784. X      lu=strpos(opt,'U') != -1 || strpos(opt,'u') != -1;
  1785. X      lv=strpos(opt,'V') != -1 || strpos(opt,'v') != -1;
  1786. X
  1787. X      if (lu && !right) plztx("h",dx,dy,wx,wy1,wy2,5.0,0.5,0.5,label);
  1788. X      if (lv && right) plztx("h",dx,dy,wx,wy1,wy2,-5.0,0.5,0.5,label);
  1789. X
  1790. X      if (right && !lc) return;
  1791. X      if (!right && !lb) return;
  1792. X
  1793. X      if (ll) tick1 = 1.0;
  1794. X      if (lt) pldtik(vmin,vmax,&tick1,&nsub1,&mode,&prec);
  1795. X
  1796. X      if ( (li && !right) || (!li && right) ) {
  1797. X        minor = -minor;
  1798. X        major = -major;
  1799. X      }  
  1800. X
  1801. X      gwm(&xscl,&xoff,&yscl,&yoff);
  1802. X      dxm = dx * xscl;
  1803. X      dym = dy * yscl;
  1804. X      diag = sqrt(dxm*dxm + dym*dym);
  1805. X
  1806. X      xminor = minor * dxm/diag;
  1807. X      xmajor = major * dxm/diag;
  1808. X      yminor = minor * dym/diag;
  1809. X      ymajor = major * dym/diag;
  1810. X
  1811. X/* Draw the line */
  1812. X
  1813. X      movwor(wx,wy1);
  1814. X      if (lt) {
  1815. X        tp=tick1*floor(vmin/tick1);
  1816. Xlab2:
  1817. X        tn=tp+tick1;
  1818. X        if (ls) {
  1819. X          if (ll) {
  1820. X            for (i=0; i <= 7; i++) {
  1821. X              temp=tp+xlog[i];
  1822. X              if (betw(temp,vmin,vmax)) {
  1823. X                lambda = (temp-vmin)/(vmax-vmin);
  1824. X                plstik(wcmmx(wx),wcmmy(wy1+lambda*dwy),xminor,yminor);
  1825. X              }
  1826. X            }
  1827. X          }
  1828. X          else  {
  1829. X            for (i=1; i<= nsub1-1; i++)  {
  1830. X              temp=tp+i*(tn-tp)/nsub1;
  1831. X              if (betw(temp,vmin,vmax)) {
  1832. X                lambda = (temp-vmin)/(vmax-vmin);
  1833. X                plstik(wcmmx(wx),wcmmy(wy1+lambda*dwy),xminor,yminor);
  1834. X              }
  1835. X            }
  1836. X          }
  1837. X        }
  1838. X        temp=tn;
  1839. X        if (betw(temp,vmin,vmax)) {
  1840. X          lambda = (temp-vmin)/(vmax-vmin);
  1841. X          plstik(wcmmx(wx),wcmmy(wy1+lambda*dwy),xmajor,ymajor);
  1842. X          tp=tn;
  1843. X          goto lab2;
  1844. X        }
  1845. X      }
  1846. X
  1847. X      drawor(wx,wy2);
  1848. X
  1849. X/* Label the line */
  1850. X
  1851. X      if (ln && lt) {
  1852. X        tp=tick1*floor(vmin/tick1);
  1853. Xlab82:
  1854. X        tn=tp+tick1;
  1855. X        if (betw(tn,vmin,vmax)) {
  1856. X          if (!ll) 
  1857. X            plform(tn,mode,prec,string);
  1858. X          else
  1859. X            sprintf(string,"10\\u%d",round(tn));
  1860. X          pos=(tn-vmin)/(vmax-vmin);
  1861. X          if (ln && !right) plztx("v",dx,dy,wx,wy1,wy2,0.5,pos,1.0,string);
  1862. X          if (lm && right) plztx("v",dx,dy,wx,wy1,wy2,-0.5,pos,0.0,string);
  1863. X          tp=tn;
  1864. X          goto lab82;
  1865. X        }
  1866. X      }
  1867. X}
  1868. SHAR_EOF
  1869. echo "extracting plztx.c"
  1870. sed 's/^X//' << \SHAR_EOF > plztx.c
  1871. X/* Prints out text along a vertical axis for a 3d plot joining         */
  1872. X/*  world coordinates (wx,wy1) to (wx,wy2).                            */
  1873. X
  1874. X#include "plplot.h"
  1875. X#include <math.h>
  1876. X
  1877. Xvoid plztx(opt,dx,dy,wx,wy1,wy2,disp,pos,just,text)
  1878. Xfloat dx,dy,wx,wy1,wy2,disp,pos,just;
  1879. Xchar *opt, *text;
  1880. X{      
  1881. X      int refx, refy;
  1882. X      int vert;
  1883. X      float shift, cc, ss, def, ht;
  1884. X      float xform[4], diag;
  1885. X      float xscl, xoff, yscl, yoff, wy;
  1886. X   
  1887. X      gchr(&def,&ht);
  1888. X      gwm(&xscl,&xoff,&yscl,&yoff);
  1889. X      cc = xscl * dx;
  1890. X      ss = yscl * dy;
  1891. X      diag = sqrt(cc*cc + ss*ss);
  1892. X      cc = cc/diag;
  1893. X      ss = ss/diag;
  1894. X      gmp(&xscl,&xoff,&yscl,&yoff);
  1895. X
  1896. X      shift = 0.0;
  1897. X      if (just != 0.0) shift = plstrl(text) * just;
  1898. X      wy = wy1 + pos * (wy2 - wy1);
  1899. X      
  1900. X      if (strpos(opt,'V') != -1 || strpos(opt,'v') != -1) {
  1901. X        vert = 0;
  1902. X        refx = mmpcx(wcmmx(wx) - (disp * ht + shift) * cc);
  1903. X        refy = mmpcy(wcmmy(wy) - (disp * ht + shift) * ss);
  1904. X      }
  1905. X      else if (strpos(opt,'H') != -1 || strpos(opt,'h') != -1) {
  1906. X        vert = 1;
  1907. X        refy = wcpcy(wy) - yscl*(disp*ht*ss+shift);
  1908. X        refx = mmpcx(wcmmx(wx) - disp*ht*cc);
  1909. X      }
  1910. X      if (vert) {
  1911. X        xform[0] = 0.0;
  1912. X        xform[1] = -cc;
  1913. X        xform[2] = 1.0;
  1914. X        xform[3] = -ss;
  1915. X      }
  1916. X      else {
  1917. X        xform[0] = cc;
  1918. X        xform[1] = 0.0;
  1919. X        xform[2] = ss;
  1920. X        xform[3] = 1.0;
  1921. X      }
  1922. X      plstr(0,xform,refx,refy,text);
  1923. X}
  1924. SHAR_EOF
  1925. echo "extracting round.c"
  1926. sed 's/^X//' << \SHAR_EOF > round.c
  1927. X/* round rounds a floating point value to an integer value. */
  1928. X
  1929. X#include "plplot.h"
  1930. X#include <math.h>
  1931. X
  1932. Xint round(flt)
  1933. Xfloat flt;
  1934. X{
  1935. X    double mant, frac;
  1936. X
  1937. X    frac = modf(flt,&mant);
  1938. X    if( fabs(frac) < .5 )
  1939. X        return((int)mant);
  1940. X    else if (frac > 0)
  1941. X        return((int)(++mant));
  1942. X    else 
  1943. X        return((int)(--mant));
  1944. X}
  1945. SHAR_EOF
  1946. echo "extracting scratch"
  1947. sed 's/^X//' << \SHAR_EOF > scratch
  1948. X; I had problems with the LMKFILE when I wanted to remake the library
  1949. X; from scratch.  It barfed if I tried to pass to many source files to
  1950. X; the compiler.  Normally you shouldn't need to execute this script.
  1951. X; If you've only changed a few routines use LMK instead.  But in
  1952. X; case of disaster try this.  After you start it, take a break and
  1953. X; go get a pizza. No, wait, sorry, that was a flashback to my IBM
  1954. X; PC days.  Pop open a new window and do something else :-):-)
  1955. Xdelete lib/plplot.lib      ; delete old library
  1956. Xcopy nil: lib/plplot.lib   ; create an empty new one
  1957. Xtouch src/plabv.c src/pladv.c src/plbeg.c src/plbin.c src/plbox.c
  1958. Xtouch src/plccal.c src/plclr.c src/plcntr.c src/plcol.c src/plcont.c
  1959. Xtouch src/plcvec.c src/pldeco.c src/pldtik.c src/plend.c src/plenv.c
  1960. Xlmk
  1961. Xtouch src/plerrx.c src/plerry.c src/plerx1.c src/plery1.c src/plfont.c
  1962. Xtouch src/plform.c src/plgra.c src/plgspa.c src/plhist.c src/plhrsh.c
  1963. Xtouch src/pljoin.c src/pllab.c src/pllclp.c src/plline.c src/plmtex.c
  1964. Xlmk
  1965. Xtouch src/plnxtv.c src/plpoi1.c src/plpoin.c src/plptex.c src/plr135.c
  1966. Xtouch src/plr45.c src/plschr.c src/plsmaj.c src/plsmin.c src/plssym.c
  1967. Xtouch src/plstar.c src/plstik.c src/plstr.c src/plstrl.c src/plstyl.c
  1968. Xlmk
  1969. Xtouch src/plsvpa.c src/plsym.c src/plsym1.c src/pltext.c src/plvpor.c
  1970. Xtouch src/plvsta.c src/plwind.c src/plxtik.c src/plxybx.c src/plxytx.c
  1971. Xtouch src/plytik.c src/plzbx.c src/plztx.c src/pl3cut.c src/plbox3.c
  1972. Xlmk
  1973. Xtouch src/plgrid3.c src/plot3d.c src/plside3.c src/plt3zz.c src/plw3d.c
  1974. Xtouch src/define.c src/fatal.c src/fcnvrt.c src/genlin.c src/global.c
  1975. Xtouch src/icnvrt.c src/movphy.c src/movwor.c src/round.c src/setphy.c
  1976. Xlmk
  1977. Xtouch src/setpxl.c src/setsub.c src/stindex.c src/strpos.c src/xform.c
  1978. Xtouch src/impress.c src/laserjetii.c src/tektronix.c src/Amiga.c
  1979. Xtouch src/font01.c src/font02.c src/font03.c src/font04.c src/font05.c
  1980. Xlmk
  1981. Xtouch src/font06.c src/font07.c src/font08.c src/font09.c src/font10.c
  1982. Xtouch src/font11.c
  1983. Xlmk
  1984. SHAR_EOF
  1985. echo "extracting setphy.c"
  1986. sed 's/^X//' << \SHAR_EOF > setphy.c
  1987. X/* Sets up physical limits of plotting device and the mapping between */
  1988. X/* normalized device coordinates and physical coordinates */
  1989. X
  1990. X#include "plplot.h"
  1991. X
  1992. Xvoid setphy(xmin,xmax,ymin,ymax)
  1993. Xint xmin,xmax,ymin,ymax;
  1994. X{
  1995. X    float xpmm, ypmm, mpxscl, mpyscl;
  1996. X
  1997. X    sphy(xmin,xmax,ymin,ymax);
  1998. X    sdp((double)(xmax-xmin),(double)(xmin),(double)(ymax-ymin),
  1999. X         (double)(ymin));
  2000. X
  2001. X    gpixmm(&xpmm,&ypmm);
  2002. X    mpxscl = xpmm;
  2003. X    if (xmax <= xmin) mpxscl = -xpmm;
  2004. X    mpyscl = ypmm;
  2005. X    if (ymax <= ymin) mpyscl = -ypmm;
  2006. X    smp(mpxscl,(double)(xmin), mpyscl,(double)(ymin));
  2007. X}
  2008. X
  2009. SHAR_EOF
  2010. echo "extracting setpxl.c"
  2011. sed 's/^X//' << \SHAR_EOF > setpxl.c
  2012. X/* Sets up pixel size from the number of pixels/mm in each direction */
  2013. X
  2014. X#include "plplot.h"
  2015. X#include "declare.h"
  2016. X
  2017. Xvoid setpxl(xpmm0,ypmm0)
  2018. Xfloat xpmm0,ypmm0;
  2019. X{
  2020. X    xpmm = xpmm0;
  2021. X    ypmm = ypmm0;
  2022. X    umx  = 1000.0/xpmm;
  2023. X    umy  = 1000.0/ypmm;
  2024. X}
  2025. SHAR_EOF
  2026. echo "extracting setsub.c"
  2027. sed 's/^X//' << \SHAR_EOF > setsub.c
  2028. X/* Sets up the subpage boundaries according to the current subpage  */
  2029. X/* selected */
  2030. X
  2031. X#include "plplot.h"
  2032. X
  2033. Xvoid setsub()
  2034. X{
  2035. X      int ix, iy;
  2036. X      int nsubx, nsuby, cursub;
  2037. X      float spdxmi, spdxma, spdymi, spdyma;
  2038. X      int sppxmi, sppxma, sppymi, sppyma;
  2039. X
  2040. X      gsub(&nsubx,&nsuby,&cursub);
  2041. X      ix = (cursub-1)%nsubx;
  2042. X      iy = nsuby - (cursub-1)/nsubx;
  2043. X
  2044. X      spdxmi = (float)(ix)/(float)(nsubx);
  2045. X      spdxma = (float)(ix+1)/(float)(nsubx);
  2046. X      spdymi = (float)(iy-1)/(float)(nsuby);
  2047. X      spdyma = (float)(iy)/(float)(nsuby);
  2048. X      sspd(spdxmi,spdxma,spdymi,spdyma);
  2049. X
  2050. X      sppxmi = dcpcx(spdxmi);
  2051. X      sppxma = dcpcx(spdxma);
  2052. X      sppymi = dcpcy(spdymi);
  2053. X      sppyma = dcpcy(spdyma);
  2054. X      sspp(sppxmi,sppxma,sppymi,sppyma);
  2055. X
  2056. X      sclp(sppxmi,sppxma,sppymi,sppyma);
  2057. X      
  2058. X}
  2059. SHAR_EOF
  2060. echo "extracting stindex.c"
  2061. sed 's/^X//' << \SHAR_EOF > stindex.c
  2062. X#include "plplot.h"
  2063. X
  2064. Xint stindex(str1,str2)
  2065. Xchar *str1,*str2;
  2066. X{
  2067. X    int base;
  2068. X    int str1ind;
  2069. X    int str2ind;
  2070. X
  2071. X    for(base=0; *(str1+base)!='\0'; base++) {
  2072. X        for(str1ind=base, str2ind=0; *(str2+str2ind)!='\0' &&
  2073. X            *(str2+str2ind) == *(str1+str1ind); str1ind++, str2ind++)
  2074. X            ;   /* no body */
  2075. X
  2076. X        if(*(str2+str2ind) == '\0')
  2077. X            return(base);
  2078. X    }
  2079. X    return(-1);    /* search failed */
  2080. X}
  2081. SHAR_EOF
  2082. echo "extracting strpos.c"
  2083. sed 's/^X//' << \SHAR_EOF > strpos.c
  2084. X/* Searches string str for first occurence of character chr.  If found */
  2085. X/* the position of the character in the string is returned (the first  */
  2086. X/* character has position 0).  If the character is not found a -1 is   */
  2087. X/* returned. */
  2088. X
  2089. X#include "plplot.h"
  2090. X#include <stdio.h>     /* Needed to define NULL */
  2091. X#include <string.h>
  2092. X
  2093. Xint strpos(str,chr)
  2094. Xchar *str,chr;
  2095. X{
  2096. X    char *temp;
  2097. X
  2098. X    if ( (temp = strchr(str,chr)) != NULL)
  2099. X        return(temp - str);
  2100. X    else
  2101. X        return(-1);
  2102. X}
  2103. SHAR_EOF
  2104. echo "extracting tektronix.c"
  2105. sed 's/^X//' << \SHAR_EOF > tektronix.c
  2106. X/* This file contains the tektronix dependent routines for use with plplot. */
  2107. X
  2108. X/* Define graphics control characters. */
  2109. X#define BS    8
  2110. X#define HT    9
  2111. X#define LF   10
  2112. X#define VT   11
  2113. X#define FF   12
  2114. X#define CR   13
  2115. X#define CAN  24
  2116. X#define EM   25
  2117. X#define ESC  27
  2118. X#define FS   28
  2119. X#define GS   29
  2120. X#define US   31
  2121. X
  2122. X#include <stdio.h>
  2123. X#include "plplot.h"
  2124. X
  2125. Xstatic FILE *OutFile;
  2126. Xstatic int FirstClear=1;
  2127. X
  2128. X/* Open file. */
  2129. Xvoid tekini()
  2130. X{
  2131. X      char FileName[80];
  2132. X
  2133. X      printf("Enter file to receive tektronix graphics commands. ");
  2134. X      scanf("%s",FileName);
  2135. X
  2136. X      if ((OutFile = fopen(FileName,"w")) == NULL)  {
  2137. X          printf("Error opening %s \n",FileName);
  2138. X          exit(1);
  2139. X      }
  2140. X}
  2141. X
  2142. X/* Sets the tektronix to text mode */
  2143. Xvoid tektex()
  2144. X{
  2145. X    fprintf(OutFile,"%c",US);
  2146. X}
  2147. X
  2148. X/* Sets the tektronix to graphics mode */
  2149. Xvoid tekgra()
  2150. X{
  2151. X    /* Nothing has to be done here */
  2152. X}
  2153. X
  2154. X/* Clears the tektronix screen */
  2155. Xvoid tekclr()
  2156. X{
  2157. X      if(FirstClear) 
  2158. X        FirstClear = 0;
  2159. X      else
  2160. X        fprintf(OutFile,"%c%c",ESC,FF);
  2161. X}
  2162. X
  2163. X/* Change color */
  2164. Xvoid tekcol(colour)
  2165. Xint colour;
  2166. X{
  2167. X}
  2168. X
  2169. X/* Draws a line in the current colour from (x1,y1) to (x2,y2) */
  2170. Xvoid teklin(x1,y1,x2,y2)
  2171. Xint x1,y1,x2,y2;
  2172. X{
  2173. X    int hy,ly,hx,lx;
  2174. X
  2175. X    fprintf(OutFile,"%c",GS);
  2176. X    hy = y1/32 + 32;
  2177. X    ly = y1 - (y1/32)*32 + 96;
  2178. X    hx = x1/32 + 32;
  2179. X    lx = x1 - (x1/32)*32 + 64;
  2180. X    fprintf(OutFile,"%c%c%c%c",hy,ly,hx,lx);
  2181. X    hy = y2/32 + 32;
  2182. X    ly = y2 - (y2/32)*32 + 96;
  2183. X    hx = x2/32 + 32;
  2184. X    lx = x2 - (x2/32)*32 + 64;
  2185. X    fprintf(OutFile,"%c%c%c%c",hy,ly,hx,lx);
  2186. X}
  2187. X
  2188. X/* Close file */
  2189. Xvoid tektid()
  2190. X{
  2191. X   fclose(OutFile);
  2192. X}
  2193. X
  2194. SHAR_EOF
  2195. echo "extracting xform.c"
  2196. sed 's/^X//' << \SHAR_EOF > xform.c
  2197. X#include "plplot.h"
  2198. X
  2199. Xvoid xform(x,y,tx,ty)
  2200. Xfloat x, y, *tx, *ty;
  2201. X{
  2202. X      extern float tr[];
  2203. X
  2204. X      *tx = tr[0]*x + tr[1]*y + tr[2];
  2205. X      *ty = tr[3]*x + tr[4]*y + tr[5];
  2206. X}
  2207. X
  2208. SHAR_EOF
  2209. echo "End of archive 7 (of 7)"
  2210. # if you want to concatenate archives, remove anything after this line
  2211. exit
  2212.